package main

import (
	"bufio"
	"bytes"
	"encoding/binary"
	"fmt"
	"io"
	"log"
	"net"
)

// tcp server
func main() {
	// 监听网络端口
	listen, err := net.Listen("tcp", "127.0.0.1:20000")
	if err != nil {
		log.Println("listen failed err:", err)
		return
	}
	defer listen.Close()
	for {
		// 接收请求
		conn, err := listen.Accept() // 建立链接
		if err != nil {
			fmt.Println("accept failed err:", err)
			continue
		}
		go process(conn)
	}
}

func process(conn net.Conn) {
	defer conn.Close()
	reader := bufio.NewReader(conn)
	for {
		// 读取数据
		msg, err := decode(reader)
		if err == io.EOF {
			return
		}
		if err != nil {
			fmt.Println("decode msg failed, err:", err)
			return
		}
		fmt.Println("收到 client 发来的数据：", msg)
	}
}

// decode 消息解码
func decode(reader *bufio.Reader) (string, error) {
	// 读取信息的长度
	lengthByte, _ := reader.Peek(4) // 读取前 4 个字节的长度
	lengthBuff := bytes.NewReader(lengthByte)
	var length int32
	err := binary.Read(lengthBuff, binary.LittleEndian, &length)
	if err != nil {
		return "", err
	}
	// buffered 返回缓存区中现有的可读取的字节数
	if int32(reader.Buffered()) < length+4 {
		return "", err
	}
	// 读取真正的消息数据
	pack := make([]byte, int(4+length)) // 每次只读去固定长度的数据
	_, err = reader.Read(pack)
	if err != nil {
		return "", err
	}
	return string(pack[4:]), nil
}
